#ifndef MYSQLMYHANDLER_H
#define MYSQLMYHANDLER_H

#include <QString>
#include <QSqlQuery>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QList>
#include <QStringList>
#include <QSqlRecord>
#include <vector>
#include <iostream>
#include <QSqlDriver>

using namespace std;
#define MAX_CON_COUNT 10;

struct Conn_name_stat
{
    QString con_name;
    bool is_available;           //连接是否空闲可以使用
};

//需要加上static 不然出现 multiple define error
//向量实现动态存储 ,存储最大十10个连接名，和连接名是否可以使用的状态值
//每次调用api的时候从设置，断开连接的时候删除元素
static vector<Conn_name_stat> g_v_conn_name_stat;

struct DBServInfo
{
    QString hostname;
    QString username;
    QString password;
    QString dbname;
    int port;
    QString socket;
    unsigned long clientflag;
};

class Connect_Manager{
private:

    static Connect_Manager* instance;
    static Connect_Manager* getInstance()
    {
        if(instance==NULL)
        {
               instance = new Connect_Manager;
                   return  instance;
        }
        else {
            return  instance;
        }
    }
    Connect_Manager(){}

    struct DBServInfo
    {
        QString hostname;
        QString username;
        QString password;
        QString dbname;
        int port;
        QString socket;
        unsigned long m_clientflag;
    };
    //存放连接的状态，和线程id
    //vector<int,int> serv_conn;
    enum
    {
        MYSQL_USER_STATUS_INIT = 0,
        MYSQL_USER_STATUS_READY,
        MYSQL_USER_STATUS_BUSY,
        mysql_user_status_TRAN,
        MYSQL_USER_STATUS_FAILE,
    };
    bool m_conn_state;    //当前用户的连接状态
    int m_index;         //当前用户连接的序号
};

class MysqlMyHandler
{
public:
    MysqlMyHandler();
    ~ MysqlMyHandler();
    void initConn(QString& hostname,QString& username,QString& password,QString& dbname,
    int& port,QString& socket,unsigned long& m_clientflag,QString& conn_name);
    bool insertData(const QString tablename,QVariantMap map);
    bool deleteData(const QString sqlstatement);
    bool updateData(const QString sqlstatement);
    const QSqlResult*  selectData(const QString& sqlstatement);
    //按照指定行排列，参数：1.一条sql语句；2. order by 的行字段,order by 子句在最后
    const QSqlResult* selectDataOrder(const QString& table_name, const QString &col_name);

    //sql 语句 解析封装后再执行基础操作
    bool SqlStatementDelete(const QString tablename,const QString exp);
    bool SqlStatementUpdate(const QString tablename,const QString exp);

    bool deleteAllDataByTruncate(const QString tablename);
    bool deleteAllDataByDelete(const QString tablename);
    // 返回值： 查询结果集； 参数 ：SQL 查询语句

    void setDBConn(); //设置mysql服务器参数
    void closeConn();

    // 支持 多条SQL语句的分割，以供调用基础接口函数使用
    //返回解析的字符串
    const QSqlResult*  multilSqlStatemtSelect(const QString& sqlstatement);
    bool checkDBStatus(QString conname);
    QMap<QString ,QString> getTableInfo(QString table);
    bool openState;
    // Conn_name_stat m_conn_name_stat[10];       //预先设置10个可以使用的连接，当启用1一个连接的时候设置一个连接，同时不能超出了最大容量10
    void printTableStruct(QString tablename);

    bool hasFeaturesofTransaction();
    bool startTransaction();
    bool commitTransaction();
private:
    QString m_mysqlInput;
    QSqlDatabase m_db;
    QSqlQuery m_myquery;
    QString m_hostName;
    QString m_userName;
    QString m_password;
    QString m_dbname;
    int m_port;
    QString m_socket;
    unsigned long m_clientflag;

    /*
    struct DBServInfo
    {
        QString hostname;
        QString username;
        QString password;
        QString dbname;
        int port;
        QString socket;
        unsigned long clientflag;
    };
    */
    QString m_conn_name;
};

#endif // MYSQLMYHANDLER_H
